Docker简述

您所在的位置:网站首页 dockerfile 端口 Docker简述

Docker简述

2023-03-22 14:22| 来源: 网络整理| 查看: 265

一、基本概念

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

概念说明镜像(Images)Docker 镜像是用于创建 Docker 容器的模板,比如Centos系统。容器(Container)容器是独立运行的一个或一组应用,是镜像运行时的实体。客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker SDK与 Docker 的守护进程通信。主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。仓库(Registry)Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 : 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

二、DockerFile

Dockerfile是自定义镜像的一套规则,其由多条指令构成,Dockerfile中的每一条指令都会对应于Docker镜像中的每一层。

Dockerfile中的每个指令都会创建一个新的镜像层(是一个临时的容器,执行完后将不再存在,再往后进行重新的创建与操作)镜像层将被缓存和复用(后续的镜像层将基于前面的一层,每一层都会有下面几层的缓存)当dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了(后续操作必然更改前面的镜像层),那么对应的镜像层缓存就会失效(自动销毁)某一层的镜像缓存失效之后,它之后的镜像层缓存都会失效(第一层不成功,那么第二层也不成功,相当于地基)容器的修改并不会影响镜像,如果在某一层中添加一个文件,在下一层中删除它,镜像中依然会包含该文件

结构:基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令

指令含义FROM [镜像]指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令,例如centos:7。from有两层含义:①开启一个新的镜像②必须写的一行指令MAINTAINER [名字]说明新镜像的维护人信息(可写可不写)RUN命令每一条RUN后面跟一条命令,在所基于的镜像上执行命令,并提交到新的镜像中,RUN必须大写CMD [“要运行的程序”,“参数1”、“参数2”]指定启动容器时需要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能执行最后一条,“bin/bash”也是一条CMD,并且会覆盖image镜像里面的cmd。EXPOSE [端口号]指定新镜像加载到Docker时要开启的端口暴露端口,就是这个容器暴露出去的端口号。ENV [环境变量] [变量值]设置一个环境变量的值,会被后面的RUN使用。容器可以根据自己的需求创建时传入环境变量,镜像不可以。ADD [源文件/目录] [目标文件/目录]①将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,②或者是一个URL,③若源文件是压缩包则会将其解压缩COPY [源文件/目录] [目标文件/目录]将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中,copy只能用于复制,add复制的同时,如果复制的对象是压缩包,ADD还可以解压,copy比add节省资源VOLUME [“目录”]在容器中创建一个挂载点,简单来说就是-v,指定镜像的目录挂载到宿主机上。USER [用户名/UID]指定运行容器时的用户WORKDIR [路径]为后续的RUN、CMD、ENTRYPOINT指定工作目录,相当于是一个临时的"CD",否则需要使用绝对路径,例如workdir/opt。移动到opt目录,并在这下面的指令都是在opt下执行。ONBUILD [命令]指定所生成的镜像作为一个基础镜像时所要运行的命令*(是一种优化)**HEALTHCHECK健康检查

三、镜像分层

Docker对container的使用基本是建立在LXC基础之上的,利用AUFS来实现对container的快速更新。AUFS (AnotherUnionFS) 是一种 Union FS,简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。

1、在Docker镜像的最底层是bootfs,这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

2、rootfs在bootfs之上,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

3、执行命令,每个命令都是在上一层基础上进行叠加(上层的image依赖下层的image,因此docker中把下层的image称作父image,没有父image的image称作base image)。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

从一个image启动一个container,docker会先加载其父image直到base image,用户的进程运行在writeable的layer中。所有parent image中的数据信息以及ID、网络和lxc管理的资源限制等具体container的配置,构成一个docker概念上的container。

四、服务部署示例

1、java包部署(依赖Java8环境),dockerFile如下

FROM java:8 # 切换工作目录 WORKDIR /startup # 复制文件到当前文件夹 COPY application.yml . COPY uap-register-server.jar . # 执行启动语句 ENTRYPOINT ["java","-Xms512m","-Xmx1024m","-jar","springTest.jar","--spring.config.location=application.yml"]

2、页面部署(依赖Nginx),dockerFile如下

# 指定拉取的镜像(指定版本号) FROM nginx:latest # 切换工作目录 WORKDIR /etc/nginx # 复制文件到当前文件夹 COPY server.crt . COPY server.key . COPY nginx.conf . WORKDIR /etc/nginx/html COPY dist.zip . # 执行解压、删除命令 RUN unzip dist.zip && rm -rf dist.zip # 执行字段替换命令 RUN sed -i "s#gateway_url: 'http_type://html_ui_com/gateway/'#gateway_url:'http://localhost:2233/'#g" static/js/app.js WORKDIR /etc/nginx/logs # 指定对外暴露的接口 EXPOSE 8080

参考:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3